package exam.exam04;

public class Test {
    //编写两个线程,一个线程打印1-52的整数，另一个线程打印字母A-Z。打印顺序为12A34B56C....5152Z。即按照整数和
    //字母的顺序从小到大打印，并且每打印两个整数后，打印一个字母，交替循环打印，直到打印到整数52和字母Z结
    //束。

    //创建两个线程，分别实现打印数字和字母的功能
    public static void main(String[] args) {
        Printer p = new Printer();//创建打印类对象

        Runnable task1 = new Runnable() {// 任务1是输出数字
            @Override
            public void run() {
                for (int i = 1; i <= 52; i++) {
                    p.printNumber(i); // 调用打印数字的方法
                }
            }
        };
        Thread t1 = new Thread(task1);
        Runnable task2 = new Runnable() {// 任务2是输出字母
            @Override
            public void run() {
                for (char c = 'A'; c <= 'Z'; c++) {
                    p.printLetter(c);  // 调用打印字母的方法
                }
            }
        };
        Thread t2 = new Thread(task2);
        t1.start();
        t2.start();
    }
}
class Printer{
    public static int index = 1;// 打印总数，用于控制输出数字或字
    public synchronized void printNumber(int i) {// 打印数字
        while(index % 3 == 0){// 当要打印第三个的时候等待
            try {
                wait();  // 当要打印字母的时候等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print(i); // 打印符合的数字
        index++;
        notifyAll(); // 唤醒所有线程
    }
    public synchronized void printLetter(char c) {// 打印字母
        while (index %3 != 0){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print(c+" ");
        index++;
        notifyAll();  // 唤醒所有线程
    }

}
